/**********************************
  * 文件：Cmds.c
  * 作者：dongjianye
  * 版本：v1.0.0
  * 日期：2019-12-03
  * 说明：定义和注册shell命令
***********************************/
#include "Shell.h"
#include "Cmds.h"
#include <string.h>
#include <stdlib.h>
#include "Hardware.h"
#include "YLDeviceCtrl.h"

#if CONFIG_SHELL
/*******************************************************************************
  * 函数名：Msh_Help
  * 功  能：“help”命令执行函数
  * 参  数：无
  * 返回值：无
  * 说  明：打印出所有支持的命令、以及相关描述信息
*******************************************************************************/
int Msh_Help(int argc, char **argv)
{
    struct shell_syscall *index = NULL;
	extern struct shell_syscall *_syscall_table_begin, *_syscall_table_end;
	
    DEBUG("OS shell commands:\r\n");
    for (index = _syscall_table_begin; index < _syscall_table_end; index++)
    {
        DEBUG("%-15s - %s\r\n", index->name, index->desc);
    }
    DEBUG("\r\n");
    return (SHELL_REY_CMD_OK);
}

/*******************************************************************************
  * 函数名：Msh_Reboot
  * 功  能：“Reboot”命令执行函数
  * 参  数：无
  * 返回值：无
  * 说  明：重启
*******************************************************************************/
int Msh_Reboot(int argc, char **argv)
{
    // 重启MUC
    Hardware_SystemReset();
    
    return (SHELL_REY_CMD_OK);
}

/*******************************************************************************
  * 函数名：Msh_SetLevel
  * 功  能：“setlevel”命令执行函数
  * 参  数：无
  * 返回值：无
  * 说  明：设置档位
*******************************************************************************/
int Msh_SetLevel(int argc, char **argv)
{
    return (SHELL_REY_CMD_OK);
}

/*******************************************************************************
  * 函数名：Msh_SetPot
  * 功  能：“setpot”命令执行函数
  * 参  数：无
  * 返回值：无
  * 说  明：设置锅具状态
*******************************************************************************/
int Msh_SetPot(int argc, char **argv)
{
    if(argc == 3)
    {
        Bool bPot = (Bool)atoi(argv[2]);
        extern YLCommDevInfor_ts sYLDevInfor;
        
        // 调试信息
        DEBUG("Set %s pot:%d\r\n",argv[1],bPot);
        
        if(strcmp(argv[1],"CZ1") == 0)
        {
            sYLDevInfor.u8PanState[u8CZ1] = bPot;
            return (SHELL_REY_CMD_OK);
        }
        else if(strcmp(argv[1],"CZ2") == 0)
        {
            sYLDevInfor.u8PanState[u8CZ2] = bPot;
            return (SHELL_REY_CMD_OK);
        }
        else if(strcmp(argv[1],"CZ3") == 0)
        {
            sYLDevInfor.u8PanState[u8CZ3] = bPot;
            return (SHELL_REY_CMD_OK);
        }
        else if(strcmp(argv[1],"CZ4") == 0)
        {
            sYLDevInfor.u8PanState[u8CZ4] = bPot;
            return (SHELL_REY_CMD_OK);
        }
        else
        {
            return SHELL_RET_CMD_ARGERR;
        }
    }
    else
    {
        return SHELL_RET_CMD_ARGERR;
    }
}

//CMDTab列表，程序员需根据需求完善命令列表
const struct shell_syscall shell_cmd_tab[] =
{
    //命令          描述                    执行函数
    {"help",        "os shell help",        Msh_Help            },
    {"reboot",      "reboot system",        Msh_Reboot          },
    {"setlevel",    "change level",         Msh_SetLevel        },
    {"setpot",      "set pot state",        Msh_SetPot          },
};

/*******************************************************************************
  * 函数名：CMDTab_GetTabStartAddr
  * 功  能: 获取CMD表起始地址
  * 参  数：无
  * 返回值：CMD表起始地址
  * 说  明：无
*******************************************************************************/
U32 CMDTab_GetTabStartAddr(void)
{
	return ((U32) shell_cmd_tab);
}

/*******************************************************************************
  * 函数名：CMDTab_GetTabEndAddr
  * 功  能：获取CMD表结束地址
  * 参  数：无
  * 返回值：CMD表结束地址
  * 说  明：无
*******************************************************************************/
U32 CMDTab_GetTabEndAddr(void)
{
	return ((U32) (shell_cmd_tab + (ARRAY_SIZE(shell_cmd_tab))));
}

#endif

